#include"udpserver.hpp"
#include "addr.hpp"
#include"route.hpp"
#include"threadpool.hpp"
#include<functional>
// string echo_repeat(string mess,inetaddr addr){
//      string ret;
//      ret+="return ";
//      ret+=mess;
//      return ret;

// }

using fn=function<void()>;
int main(int argc ,char* argv[]){
    // if(argc != 3)
    // {
    //     std::cerr << "please use: " << argv[0] << " ip"<<" port" << std::endl;
    //     return 1;
    // }

    if(argc != 2)
    {
        std::cerr << "please use: " << argv[0] <<" port" << std::endl;
        return 1;
    }

    consolestrategy;
      //string ip=argv[1];//string内置机制不会直接拷贝指针
      // uint16_t port=stoi(argv[2]);//先构造string

       uint16_t port=stoi(argv[1]);

   // unique_ptr<udpserver> ur=make_unique<udpserver>(ip,port);
   //unique_ptr<udpserver> ur=make_unique<udpserver>(port);
   //回调：

    Route r;
    
    
     //2`服务端启动接受信息后进行查找功能：
     //单线程：
//    unique_ptr<udpserver> ur=make_unique<udpserver>(port,[&r](int fd,string mess,inetaddr ar){
//                r.messroute(fd,mess,ar);
//    });

  //线程池版本：
   
    auto tp=Threadpool<fn>::getinstance();
  unique_ptr<udpserver> ur=make_unique<udpserver>(port,[&r,&tp](int fd, string mess,inetaddr ar){
    //因此可以把messroute绑定成无参对象用bind：
    fn tk=std::bind(&Route::messroute,&r,fd,mess,ar);//此时就不用给线程池任务传参了；这里this指针必须给出值
    tp->equeue(tk);//只允许传递无参数无返回值的对象或者函数进行处理
});
   ur->init();
    ur->start();
     
}